home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / util / EvenBetterBusError.sit / EvenBetterBusError / EvenBetterBusError (Boyd) next >
Text File  |  1994-10-12  |  6KB  |  119 lines

  1. The following is from the November editorial.  Included is source code for 
  2. EvenBetterBusError which will assemble using the MPW assembler.  I've made
  3. minor modifications for more satisfactory results (namely - changed the
  4. string to be more specific about the nature of the problem).
  5.  
  6. Copyright © 1994 by MacTech Magazine.  All rights reserved.
  7.  
  8. Feel free to use this source to build your own version, but please don't
  9. release them under the name EvenBetterBusError.  Please do include Greg Marriott
  10. and MacTech Magazine in your credits.
  11.  
  12. -----
  13.  
  14. Unclear On The Concept
  15. by Scott T Boyd
  16.  
  17. A reader recently sent in an excerpt from the read me for a product which shall
  18. remain nameless:
  19.     “A common debugging tool many Mac programmers use is called EvenBetterBusError.
  20.     This tool forces a Mac to crash when certain conditions arise in order to point
  21.     out POTENTIAL problems to the programmer. The programmer can then assess the
  22.     situation and decide if there is a REAL problem which needs to be fixed. ProductX
  23.     happens to frequently create the kinds of situations which EvenBetterBusError
  24.     watches for. So, if you have EvenBetterBusError installed, you will crash
  25.     frequently with ProductX – but this is not a bug! Remove EvenBetterBusError to
  26.     eliminate the crashes. You may be asking yourself why this might concern you –
  27.     some beta releases of System Software from Apple automatically install
  28.     EvenBetterBusError when you install them. This little tool may be in your system
  29.     folder without you knowing it if you are a beta tester for Apple.”
  30. First, a little background.  EvenBetterBusError was written by Greg Marriott
  31. while we were at Apple.  Greg was responsible for checking out incompatibility
  32. bugs between System 7 (that’s 7.0) and third-party software.  He became a master
  33. bug hunter, and nailed tons of bugs, both in our software and in third-party
  34. software.  Along the way, he developed several tools for his own detective work,
  35. and to give to others so they could have a better chance of catching things
  36. before they showed up in his bug list.  EvenBetterBusError is a descendant of Mr.
  37. Bus Error, which later turned into BetterBusError, and Greg took it even further.
  38.  Here’s what it does.
  39. • It puts a 4-byte value into memory location 0.  The value it puts in is
  40. designed to generate a bus error or an illegal instruction on any Macintosh.  If
  41. someone dereferences a nil pointer, they’ll immediately generate a bus error.  In
  42. addition, they’ll crash if they jump to 0.
  43. • It periodically checks to see whether someone has written to location 0
  44. (probably using a NIL pointer).  If so, it drops into the debugger and says,
  45. “Write to NIL.”
  46. Both of these behaviors can help you track down misbehaving software early, prior
  47. to subjecting your customers to the seemingly-random system “degradation” such
  48. bugs can induce.
  49. Here’s some reconstituted code which shows you everything that EvenBetterBusError
  50. does.  I used TMON Pro to disassemble and save the code from the INIT resource,
  51. then added comments and labels.  As you can see, it’s pretty simple.  It installs
  52. a VBL task which periodically checks location 0, drops into the debugger if it
  53. needs to, and stuffs $50FF8001 back into location 0.
  54.  
  55.             INCLUDE    'Traps.a'
  56.  
  57. start    main
  58.  
  59.         BRA.S   InstallVBL
  60. BeginCodeBlock
  61. VBLRecord   
  62.              DC.L 00000000,0001  ; QElemPtr,  queue type (1==VBL queue)
  63.              DC.L 00000000       ; ptr to VBL code
  64.              DC.W 0001,0000      ; timeout count & phase count
  65.         MOVE.L  $0,D0               ; put location 0’s contents into D0
  66.         ANDI.L  #$7FFFFFFF,D0       ; strip the high bit
  67.         CMPI.L  #$50FF8001,D0        ; see if someone wrote over it
  68.         BEQ.S   SkipDebugStr        ; if not, everything’s ok
  69.         CMPI.L  #$40810000,D0       ; see if it’s ProcMgr’s safe value
  70.         BEQ.S   SkipDebugStr        ; if so, everything’s ok
  71.         PEA     ItsEvenBetterBusErrorsFault
  72.         _DebugStr
  73. SkipDebugStr 
  74.         MOVE.L  #$50FF8001,$0       ; put a bus error value at $0
  75.         MOVE.W  #$0001,$000A(A0)    ; reset the VBL timer
  76.         RTS
  77. EndOfCodeBlock
  78.  
  79. ItsEvenBetterBusErrorsFault   DC.B 'Someone’s buggy software wrote to NIL',00
  80. SizeOfCodeBlock    equ    EndOfCodeBlock-BeginCodeBlock
  81.           
  82. InstallVBL 
  83.         MOVEQ   #SizeOfCodeBlock,D0 ; allocate a block for the code & data
  84.         _NewPtr  ,sys                       ; make a block in the system heap
  85.         MOVE.L  A0,-(A7)            ; remember this block's address
  86.         MOVEA.L A0,A1
  87.         LEA     VBLRecord,A0        ; a static copy of our VBL record
  88.         MOVEQ   #SizeOfCodeBlock,D0 ; the size of the VBL code & data
  89.         _BlockMove            ; copy from INIT rsrc into system heap block
  90.         MOVEA.L (A7)+,A0            ; the system heap block
  91.         PEA     $000E(A0)           ; addr of ptr to VBL in VBL record
  92.         MOVE.L  (A7)+,$0006(A0)     ; stuff ptr to VBL code
  93.         _VInstall
  94.         MOVE.L  #$50FF8001,$0       ; put a bus error value at $0
  95.         RTS
  96.  
  97.     endproc
  98.     
  99.     end
  100.  
  101. You might have noticed my sarcastic label on the string.  Every week at Apple,
  102. someone unclear on the concept assigned a bug to Greg that read something like,
  103. “EvenBetterBusError caused the problem.  Taking it out of the System Folder fixed
  104. the crashes.”  This common misperception puts the blame on the messenger, not the
  105. culprit.  
  106.  
  107. It’s never ok to write to location 0, nor is it ever ok to dereference
  108. a NIL pointer.  Code that does these things is buggy. 
  109.  
  110. As you might imagine, the above read me file struck me (and Greg) as something of
  111. a challenge (really more of an affront, but challenge sounded nicer).  In just
  112. starting up the software, before even getting to the EvenBetterBusError DebugStr
  113. call, the code committed these nefarious acts:  it called DisposeHandle on a PICT
  114. resource, and called DisposeHandle on an already-disposed handle. Greg wanted me
  115. to call them liars. I’ll go him one better.  In my opinion, they’re boneheads,
  116. the kind that give the Macintosh a bad name and get yahoos demanding memory
  117. protection in the operating system.  On the other hand, kudos to Apple for
  118. including EvenBetterBusError in the beta versions!
  119.